package com.sxj.corejava.code15_反射;

import java.lang.reflect.Field;

public class Test04_操作属性 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class c = User.class;
        // 通过Class对象操作属性
        // 1.获取当前类以及其父类中所有public修饰的属性
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("***************************************");

        // 2.获取当前类中所有属性,不区分修饰符
        fields = c.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("***************************************");

        // 3.获取当前类以及其父类中指定的public修饰的属性
        Field usernameField = c.getField("username");
        System.out.println(usernameField);
        // 如果指定属性不是public修饰的,则报错
//        Field passwordField = c.getField("password");
//        System.out.println(passwordField);

        // 4.获取当前类中指定的属性,不区分修饰符
        Field passwordField = c.getDeclaredField("password");
        System.out.println(passwordField);


        // 通过Field对象操作属性
        // 1.赋值,相当于set方法
        User user = new User();
        usernameField.set(user, "admin");
        passwordField.set(user, "123456");
        // 无法访问private修饰的属性
        // 可以通过破坏封装原则的方式进行访问
        Field idField = c.getDeclaredField("id");
        idField.setAccessible(true);
        idField.set(user, 1);
        System.out.println(user);

        // 2.取值,相当于get方法
        System.out.println("username:" + usernameField.get(user));
        System.out.println("password:" + passwordField.get(user));
        System.out.println("id:" + idField.get(user));
    }
}
